Fork me on GitHub

cuckoo沙箱安装笔记

沙盒(Sanbox)是一种将未知、不可信的软件隔离执行的安全机制。恶意软件分析沙盒一般用来将不可信软件放在隔离环境中自动地动态执行,然后提取其运行过程中的进程行为、网络行为、文件行为等动态行为,安全研究员可以根据这些行为分析结果对恶意软件进行更深入地分析。为了搭建一个运行恶意样本的隔离环境,近期调研了cuckoo沙箱,实现了host与多guest机的配置,并且可以通过api提交样本自动化运行。

安装参考教程

  1. 很详细的一篇:https://blog.csdn.net/Bingoooooo_/article/details/94248229
  2. 总体步骤正确:https://www.jianshu.com/p/ac009f6c2710

安装过程遇到的问题

按照参考1基本就可以完成沙箱的配置,但是中途还是会踩坑,记录一下。

1. 运行cuckoo报错ImportError:lib*.so–cannot open shared object file: No such file or directory

  • 解决方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    软链接方式
        1.1 找到文件
                find  /  -name  lib**.so   (缺失的动态链接库)  
        1.2 建立软链接
                ln - /path/to/lib**.so   /usr/lib
         1.3 sudo ldconfig

2. 运行cuckoo报错AttributeError: Rules instance has no attribute ‘save’

Please pip uninstall yara. It’s very outdated and we’re using yara-python==3.6.3 instead.

  • 解决方法:照着提示做

3. cuckoo配置过程中mongo数据库没有用户

  • 解决方法:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    在cukcoo_db的数据库里加入用户:
    db.createUser(
    {
    user: "admin",
    pwd: "admin",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
    )
    mongo --port 27017 -u "admin" -p "admin" --authenticationDatabase "admin"
    db.createUser( { user: "tmy", pwd: "pwd", roles: [ { role: "readWrite", db: "cuckoo_db" } ] })
    mongo --host localhost:27017 -u tmy -p pwd --authenticationDatabase admin

4. pip install MySQL-python报错

  • 解决方法:先sudo apt-get install libmysqlclient-dev,然后pip install

5. 最大打开文件数量太小

  • 解决方法:修改最大打开文件数量

    sudo echo 1000000 > sudolink
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    tangmingyu@tangmingyu-QiTianM610-D529:~$ ulimit -n
    1024
    tangmingyu@tangmingyu-QiTianM610-D529:~$ cat /proc/sys/fs/nr_open
    1000000
    tangmingyu@tangmingyu-QiTianM610-D529:~$ ulimit -n 1000000
    bash: ulimit: open files: 无法修改 limit 值: 不允许的操作
    tangmingyu@tangmingyu-QiTianM610-D529:~$ sudo ulimit -n 1000000
    sudo: ulimit:找不到命令
    tangmingyu@tangmingyu-QiTianM610-D529:~$ sudo vi /etc/security/limits.conf
    tangmingyu@tangmingyu-QiTianM610-D529:~$ ulimit -n
    1024
    tangmingyu@tangmingyu-QiTianM610-D529:~$ sudo sh -c "ulimit -n 65535 && exec su $LOGNAME"
    tangmingyu@tangmingyu-QiTianM610-D529:~$ ulimit -n
    500000
    tangmingyu@tangmingyu-QiTianM610-D529:~$ . venv/bin/activate
    (venv) tangmingyu@tangmingyu-QiTianM610-D529:~$ ulimit -n
    500000

6. win7虚拟机之前一直连不上外网

  • 解决方法:开启iptables的转发
    1
    2
    3
    4
    5
    6
    root@tangmingyu-QiTianM610-D529:~#
    iptables -P FORWARD ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -A FORWARD -o eth0 -i vboxnet0 -s 192.168.2.0/24 -m conntrack --ctstate NEW -j ACCEPT
    iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A POSTROUTING -t nat -j MASQUERADE

7. 软件提交之后一直是pending状态

  • 解决方法:原因是virtual manager的地址写成了virtual box

https://github.com/cuckoosandbox/cuckoo/issues/2346

8.如果系统没启用root账户,由于 tcpdump 的执行需要 root 权限,则需要以下配置:

sudo setcap cap_net_raw,cap_net_admin
1
2
3
4
5
6
sudo chmod +s /usr/sbin/tcpdump
以上方法都试过,没有用。
后来搜到了官方给的,成功了:
sudo apt-get install apparmor-utils
sudo aa-disable /usr/sbin/tcpdump
https://cuckoo.sh/docs/faq/index.html#permission-denied-for-tcpdump

9. mongo数据库的验证:db.auth(‘admin’, ‘admin’) 返回1表示成功

10. 验证guest是否成功连接上:

tangmingyu@tangmingyu-QiTianM610-D529:~$ curl 192.168.2.200:8000
{"message": "Cuckoo Agent!", "version": "0.10", "features": ["execpy", "pinning", "logs", "largefile", "unicodepath"]}

11. error fetching configuration file

一定要以管理员身份运行agent

12. 多guest配置

  • 解决方法:
    主要参考了https://blog.csdn.net/weixin_42651205/article/details/83900436
    照着做就可以,注意完全克隆虚拟机,然后改镜像名称和host添加新增虚拟机的配置。
    不过我的虚拟机原本设置的是没有密码,复制虚拟机后初始化时突然要输入用户名和密码了,账号:Administrator;密码为空试一下,成功进去了,然后再调用的时候就不用密码了。

沙箱运行情况

运行方式

. venv/bin/activate

一个终端运行cuckoo -d;另一个运行cuckoo web

VIRUSTOTAL获取样本恶意数据库情况:最近不能翻墙,连不上
替代:https://metadefender.opswat.com

有弹窗的情况下就会截图,安装软件的时候会自己点击next,一直到安装好软件并运行。如果卡在某个步骤了,会自动定时退出。

一份完整的报告大概都要90MB,其中所占空间最大的是memory、report也有十几兆

报告中还会给软件打分,但是说仅供参考
Please notice: The scoring system is currently still in development and should be considered an alpha feature.

配置api自动化提交

https://cuckoo.readthedocs.io/en/latest/usage/api/#
直接cuckoo api

(venv) tangmingyu@tangmingyu-QiTianM610-D529:~/venv/bin$ cuckoo api
2019-09-18 21:17:27,179 [werkzeug] INFO: * Running on http://localhost:8090/ (Press CTRL+C to quit)

通过命令行就可以提交样本自动分析了。

然后查看cuckoo.conf中的api_token = bZ0mLmUX2QElehFjI33OOQ

curl -H “Authorization: Bearer bZ0mLmUX2QElehFjI33OOQ” -F file=@/home/tangmingyu/文档/安全沙箱安装/恶意软件样本/test1.exe http://localhost:8090/tasks/create/file

python脚本提交样本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
REST_URL = "http://localhost:9090/tasks/create/file"
SAMPLE_FILE = "/home/tangmingyu/文档/安全沙箱安装/恶意软件样本/test1.exe"
HEADERS = {"Authorization": "Bearer bZ0mLmUX2QElehFjI33OOQ"}
with open(SAMPLE_FILE, "rb") as sample:
files = {"file": ("temp_file_name", sample)}
r = requests.post(REST_URL, headers=HEADERS, files=files)
SAMPLE_FILE = "/home/tangmingyu/文档/安全沙箱安装/恶意软件样本/test2.exe"
HEADERS = {"Authorization": "Bearer bZ0mLmUX2QElehFjI33OOQ"}
with open(SAMPLE_FILE, "rb") as sample:
files = {"file": ("temp_file_name", sample)}
r = requests.post(REST_URL, headers=HEADERS, files=files)
# Add your code to error checking for r.status_code.
task_id = r.json()["task_id"]

sudo /usr/bin/mongod -f /etc/mongodb.conf

数据库

mysql存的是提交任务时间 虚拟机配置之类的信息;mongo存储的是软件提交运行之后,产生的那些分析数据。

-------------本文结束感谢您的阅读-------------